#include <stdio.h>
#include <iostream>
#include <string>
#include <vector>
#include <math.h>
#include <algorithm>
#include <map>
#include <queue>
#include <list>

#define sf(x) scanf("%d", &x)
#define pf(x) printf("%d", x)
#define pf2(x,y) printf("%d %d ", x,y)
#define sf2(x,y) scanf("%d %d", &x,&y)
#define sff(x) scanf("%lf", &x)
#define pff(x) printf("%lf ", x)
#define ENDL printf("\n")
#define pfl(x) printf("%I64d ", x)
#define sfl(x) scanf("%I64d", &x)

using namespace std;

typedef long long ll;

bool a[37][1001];
bool flags[37];
char sw[37];
char bulb[1010];
int main()
{
	//freopen("input.txt", "r", stdin);
	//freopen("output.txt", "w", stdout);

	int n, m, q, i, j, k;
	char qaz;
	scanf("%d%d%d", &n,&m,&q);
	//string s, b;
	bool flag;
	int o;
	while (n!=0 || m!=0 || q!=0)
	{
		for ( i=0;i<q;i++)
		{
			for(j=0;j<n;j++)
			{
				scanf(" %c",&sw[j]);
				if (sw[j] == '1')
				{
					flags[j] = !flags[j];
				}
			}
			//scanf("%c",&qaz);
			for(j=0;j<m;j++)
			{
				scanf(" %c",&bulb[j]);
				for(k=0;k<n;k++)
				{
					if(!flags[k]&&bulb[j]=='1')
					{
						a[k][j]=1;
					}
					else if(flags[k]&&bulb[j]=='0')
					{
						a[k][j]=1;
					}

				}
			}
		}

		for ( i=0; i<m; i++)
		{
			flag = false;
			for ( k = 0; k<n; k++)
			{
				if (flag && a[k][i] == 0)
				{
					flag = false;
					break;
				}
				if (a[k][i]==0)
				{
					flag = true;
					o = k;
				}
			}
			if (!flag) printf("?");
			else
			{
				if (o>9)
				{
					printf("%c", o-10+'A');
				}else
				{
					pf(o);
				}
			}
		}
		ENDL;

		for( i=0; i<37; i++)
		{
			for( j=0; j<1001; j++)
			{
				a[i][j]=0;
			}
			flags[i]=0;
			sw[i]=0;
		}
		for( j=0; j<1001; j++)
		{
			bulb[j]=0;
		}

		scanf("%d%d%d", &n,&m,&q);
	}

	return 0;
}

